package com.mark.spring.annotation.life.cycle.init.disp;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

/**
 * @Description: InitializingBean 和 DisposableBean的引导类
 * @Author: Mark
 * @CreateDate: 2019/9/21 18:30
 * @Version: 3.00.001
 * @Copyright : 豆浆油条个人非正式工作室
 *
 * @see InitializingBean#afterPropertiesSet()
 * @see DisposableBean#destroy()
 *
 * 总结：
 * {@link  InitializingBean#afterPropertiesSet()} 在Bean完成属性赋值后执行
 * {@link DisposableBean#destroy()} 在IOC销毁后调用
 */
@ComponentScan("com.mark.spring.annotation.life.cycle.init.disp")
public class InitDispBootstrap {

    public static void main(String[] args) {
        //加载配置，获取bean
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(InitDispBootstrap.class);

        //关闭上下文
        applicationContext.close();

        /* 控制台打印的结果
         * City....Construct                          //构造函数
         *
         * City..@PostConstruct                       //属性赋值完调用：@PostConstruct
         * City..InitializingBean..afterPropertiesSet //属性数值完调用
         * City....initMethod                         //指定初始化方法
         *
         * City..@PreDestroy                          //IOC容器销毁前调用和@PostConstruct对应
         * City..DisposableBean..destroy              //IOC容器销毁前调用和InitializingBean..afterPropertiesSet对应
         * City....destroyMethod                      //IOC容器销毁前调用和initMethod对应
         */

        /*
         * 疑问？
         * 实现BeanPostProcessor接口方法为什么没有打印city Bean的信息？
         */
    }
}
